<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">package cs5620.object;

import javax.vecmath.AxisAngle4f;
import javax.vecmath.Color3f;
import javax.vecmath.Matrix4f;
import javax.vecmath.Point3f;
import javax.vecmath.Vector3f;

import cs5620.material.IsotropicWard;
import cs5620.material.CookTorrance;
import cs5620.material.Lambertian;
import cs5620.material.Phong;

/**
 * Created on Sep 19, 2009
 * Course: CS5620 (Interactive Computer Graphics) by Kavita Bala
 * Originally written for CS467/468 (Computer Graphics II and Practicum) by Kavita Bala
 * Copyright 2009 Computer Science Department, Cornell University
 * 
 * @author Adam Arbree -- arbree@cs.cornell.edu
 * @author Wenzel Jakob
 * @author Shuang Zhao
 */

public class Tank implements ParameterizedObjectMaker {
	//Parameters of make 				
	private String name; 	
	private float bodyHeight; 
	private float bodyWidth; 
	private float cabHeight; 
	private float cabAngle; 
	private float turretRadius; 
	private float turretLength; 
	private float turretAngle;
	
	/**
	 * All inputs are ignored.
	 * 
	 * @see cs5620.object.ParameterizedObjectMaker#make(java.lang.Object[])
	 */
	public final HierarchicalObject make(Object... inputs) {
		//Parameters  			//Default value 				
		//------------------------------------------------------------------------------------
		//String name,			//"DefaultTank"
		//float bodyHeight,		//0.36f
		//float bodyWidth,		//0.9f
		//float cabHeight,		//0.2f
		//float cabAngle,		//-10.0f //Degree 
		//float turretDiameter,	//0.05f 
		//float turretLength,	// 0.8f
		//float turretAngle		//10.0f //Degree
//-----------------------------------------------------------------------------------
//Parse parameters
		try{
			name = (String)inputs[0];
			if(name == "DefaultTank")
				throw new Exception();
			
			bodyHeight =  ((Float)inputs[1]).floatValue();  
			bodyWidth =  ((Float)inputs[2]).floatValue(); 
			cabHeight =  ((Float)inputs[3]).floatValue(); 
			cabAngle =  ((Float)inputs[4]).floatValue(); 
			turretRadius =  ((Float)inputs[5]).floatValue(); 
			turretLength =  ((Float)inputs[6]).floatValue(); 
			turretAngle =  ((Float)inputs[7]).floatValue() ;
		}
		catch (Exception e)
		{//Set to default
			 	name = "DefaultTank"; 
				bodyHeight = 0.36f ; 
				bodyWidth = 0.9f ; 
				cabHeight = 0.2f ; 
				cabAngle = -10.0f ; 		//Degree
				turretRadius = 0.05f ; 
				turretLength = 0.8f ; 
				turretAngle = 10.0f ;	//Degree
				System.out.println("Wrong parameters. Parameters (8 in total):");				
				System.out.println("String name,");
				System.out.println("float bodyHeight,");		
				System.out.println("float bodyWidth,");		
				System.out.println("float cabHeight,");		
				System.out.println("float cabAngle, //Degree");		
				System.out.println("float turretDiameter,");
				System.out.println("float turretLength,");	 
				System.out.println("float turretAngle //Degree");		
		}
		
//------------------------------------------------------------------------------------
//Build body
		HierarchicalObject track1 = makeTrack("Track1");
		track1.setTranslate(0.0f, 0.0f, (bodyWidth/2 + 0.1f));
		HierarchicalObject track2 = makeTrack("Track2");
		track2.setTranslate(0.0f, 0.0f, -(bodyWidth/2 + 0.1f));
		HierarchicalObject centralBody = makeCentralBody("CentralBody");
		centralBody.setScale(1.0f, bodyHeight /0.6f, bodyWidth/ 0.8f);		//0.36
		centralBody.setTranslate(0.0f, 0.0f, 0.0f);		
		
		Group body = new Group("Body");		
		body.addObject(track1);
		body.addObject(track2);
		body.addObject(centralBody);
//------------------------------------------------------------------------------------
//Build cap
		MeshObject cabBase = PrimitiveFactory.makeCylinder(10,30,"CabBase");
		cabBase.setScale(0.4f, cabHeight/2, 0.3f * bodyWidth/0.8f);

		MeshObject cylinder = PrimitiveFactory.makeCylinder(10,30,"Cylinder");
		cylinder.setScale(turretRadius, turretLength/2, turretRadius);
		cylinder.setRotationAxisAngle(90.0f, 0.0f, 0.0f, 1.0f);
		cylinder.setTranslate(turretLength/2, 0.0f, 0.0f);

		Group turret = new Group("Turret");
		turret.addObject(cylinder);
		turret.setRotationAxisAngle(turretAngle, 0.0f, 0.0f, 1.0f);
		turret.setTranslate(0.4f - 0.1f, 0.0f, 0.0f);
		
		Group cab = new Group("Cab");
		cab.addObject(cabBase);
		cab.addObject(turret);

		cab.setTranslate(-0.2f, bodyHeight + cabHeight/2, 0.0f);		
		cab.setRotationAxisAngle(cabAngle, 0.0f, 1.0f, 0.0f);		
//------------------------------------------------------------------------------------
//Build tank
		Scene out = new Scene(name);
		
		out.addObject(body);
		out.addObject(cab);
//------------------------------------------------------------------------------------
//For test 
		/*MeshObject plane1 = PrimitiveFactory.makePlane("Plane1");
		plane1.setTranslate(0, -1f, 0);
		plane1.setScale(1f,1f,1f);
		MeshObject plane2 = PrimitiveFactory.makePlane("Plane2");
		//plane2.setTranslate(0, bodyHeight + 0.2f, 0); //0.36 + 0.2
		plane2.setTranslate(0, 1f, 0); //0.36 + 0.2
		plane2.setScale(1f,1f,1f);
		
		out.addObject(plane1);
		out.addObject(plane2);*/

//------------------------------------------------------------------------------------
		return out;
	}

	private final HierarchicalObject makeTrack(Object... inputs) {
		//-----make track------------------------------------------------------------
		MeshObject trackBox = PrimitiveFactory.makeBox("TrackBox");
		trackBox.setScale(0.6f, 0.2f, 0.1f+0.001f);
		//trackBox.setTranslate(-0.6f, -0.25f, -0.6f);
		//trackBox.setMaterial(new CookTorrance(new Color3f(0.6f, 0.55f, 0.3f),
		//		new Color3f(0.6f, 0.55f, 0.3f), 0.4f, 4.0f));

		
		MeshObject trackCylinder = PrimitiveFactory.makeCylinder( 10, 30, "TrackCylinder1");
		trackCylinder.setScale(0.2f, 0.1f, 0.2f);
		trackCylinder.setRotationAxisAngle(90.0f, 1.0f, 0.0f, 0.0f);
		trackCylinder.setTranslate(0.6f, 0.0f, 0.0f);
		MeshObject trackCylinder2 = PrimitiveFactory.makeCylinder( 10, 30, "TrackCylinder2");
		trackCylinder2.setScale(0.2f, 0.1f, 0.2f);
		trackCylinder2.setRotationAxisAngle(90.0f, 1.0f, 0.0f, 0.0f);
		trackCylinder2.setTranslate(-0.6f, 0.0f, 0.0f);

		Group track = new Group((String)inputs[0]);
		track.addObject(trackBox);
		track.addObject(trackCylinder);
		track.addObject(trackCylinder2);

		return track;
	}
	
	private final HierarchicalObject makeCentralBody(Object... inputs) {
		HierarchicalObject base = makeTrack("Base");
		base.setScale(1.0f, 1.0f, 4.0f);//* (0.6f, 0.2f, 0.1f) = 0.6f, 0.12f, 0.5f 
										//* (0.2f, 0.2f, 0.1f) = 0.2f, 0.12f, 0.5f

		MeshObject centralBox = PrimitiveFactory.makeBox("CentralBox");
		float centralBoxHeight = 0.3f;
		float centralBoxLength = 0.6f;
		centralBox.setScale(centralBoxLength, centralBoxHeight, 0.4f);
		centralBox.setTranslate(-(0.6f+0.2f-centralBoxLength), centralBoxHeight, 0.0f);

		float a = 1.4f - 2*centralBoxLength;
		float b = 2* centralBoxHeight;
		double angle1 = Math.atan(a /b);
		double angle2 = Math.asin(0.2 /(a/Math.sin(angle1)));
		double angle3 = angle1 + angle2 ;
		float trianglePrismHeight = (float)(b - 0.2 * Math.sin(angle3))/2.0f;
		float trianglePrismLength = (float)(a + 0.2 * Math.cos(angle3))/2.0f;

		MeshObject trianglePrism = PrimitiveFactory.makeTrianglePrism("TrianglePrism");
		trianglePrism.setRotationAxisAngle(-90.0f, 1.0f, 0.0f, 0.0f);
		trianglePrism.setScale(trianglePrismLength, 0.4f, trianglePrismHeight);
		trianglePrism.setTranslate(trianglePrismLength + centralBoxLength - 0.2f, 2*centralBoxHeight - trianglePrismHeight, 0.0f);

		Group centralBody = new Group((String)inputs[0]);
		centralBody.addObject(base);
		centralBody.addObject(centralBox);
		centralBody.addObject(trianglePrism);
		
		return centralBody;
	}
	
}
</pre></body></html>